package com.liao.rent.utils;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;

import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Author: ljt
 * @Description: mybatis-plus代码生成器
 * @DateTime: 2024/11/24 下午4:27
 **/
public class CodeGenerator{

//    指定数据库地址
    private  static  final String URL="jdbc:mysql://localhost:3306/rent?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai";
//    用户名
    private  static  final String USERNAME="root";
//    密码
    private  static  final String PASSWORD="root";



    public static void main(String[] args) {
        List<String> tables = new ArrayList<>();

        //添加 表 到集合中，可以添加多个表
        tables.add("sys_user");


        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                .globalConfig(builder -> {
                    builder.author("liao") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(System.getProperty("user.dir")+"src/main/java")// 指定输出目录
                            .commentDate("yyyy-MM-dd"); // 设置注释日期格式

                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.liao.rent") // 设置父包名
                                .moduleName("")// 设置父包模块名
                                .entity("entity") // 设置 Entity 包名
                                .service("service") // 设置 Service 包名
                                .serviceImpl("serviceImpl") // 设置 Service Impl 包名
                                .mapper("mapper") // 设置 Mapper 包名
                                .xml("mapper") // 设置 Mapper XML 包名
                                .controller("controller") // 设置 Controller 包名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir")+"src/main/resources/mapper")) // 设置mapperXml生成路径
                )


                //策略配置: 所谓策略配置，就是配置策略，配置细节
                .strategyConfig(builder -> {
                    //addInclude(表)就是指定为哪些表生成代码
                    builder.addInclude(tables)  //表明是通过哪个表生成的
                            .serviceBuilder()  //service生成策略配置
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")
                            .entityBuilder() //实体类生成策略配置
                            .enableLombok() //开启Lombok
                            .logicDeleteColumnName("deleted")//说明逻辑删除的字段是哪个
                            .enableTableFieldAnnotation() //开启属性上加上说明注解
                            .controllerBuilder()  //controller生成策略配置
                            // 映射路径使用连字符格式，而不是驼峰
//                           .enableHyphenStyle()
                            .formatFileName("%sController")
                            .enableRestStyle() //开启RestController生成策略配置
                            .mapperBuilder()  //mapper生成策略配置
                            //生成通用的resultMap
                            .enableBaseResultMap()
                            .superClass(BaseMapper.class)  //所有mapper类继承BaseMapper
//                           .formatMapperFileName("%sMapper")
                            .enableMapperAnnotation() //开启@mapper注解
                            .formatXmlFileName("%sMapper");

                    new StrategyConfig.Builder()
                            .entityBuilder()
                            //                模板不生效
//                            .javaTemplate(System.getProperty("user.dir")+"/src/main/resources/templates/myEntity.java")// 设置实体类模板
                            .enableLombok() //开启 lombok 模型
//                            .versionPropertyName("version")  //乐观锁
                            .logicDeletePropertyName("deleted") //逻辑删除
//                           .naming()  //数据库表映射到实体的命名策略,默认下划线转驼峰命
                            .idType(IdType.ASSIGN_ID) //全局主键类型
                            .addTableFills(new Column("create_time", FieldFill.INSERT)) //字段填充
                            .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE));//属性填充


                })

                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
